home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / share / pyshared / GDebi / GDebiCli.py < prev    next >
Text File  |  2008-08-05  |  5KB  |  143 lines

  1. # Copyright (c) 2005-2007 Canonical
  2. #
  3. # AUTHOR:
  4. # Michael Vogt <mvo@ubuntu.com>
  5. #
  6. # This file is part of GDebi
  7. #
  8. # GDebi is free software; you can redistribute it and/or
  9. # modify it under the terms of the GNU General Public License as published
  10. # by the Free Software Foundation; either version 2 of the License, or (at
  11. # your option) any later version.
  12. #
  13. # GDebi is distributed in the hope that it will be useful,
  14. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16. # General Public License for more details.
  17. #
  18. # You should have received a copy of the GNU General Public License
  19. # along with GDebi; if not, write to the Free Software
  20. # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  21. #
  22.  
  23.  
  24. import sys, time, thread, os, fcntl, string
  25. import warnings
  26. from warnings import warn
  27. warnings.filterwarnings("ignore", "apt API not stable yet", FutureWarning)
  28. import apt
  29. import apt_pkg
  30. from gettext import gettext as _
  31.  
  32. from DebPackage import DebPackage, Cache
  33. from DscSrcPackage import DscSrcPackage
  34.  
  35. from subprocess import PIPE, Popen
  36.  
  37. class GDebiCli(object):
  38.  
  39.     def __init__(self, options):
  40.         # fixme, do graphic cache check
  41.         self.options = options
  42.         if options.quiet:
  43.             tp = apt.progress.OpProgress()
  44.         else:
  45.             tp = apt.progress.OpTextProgress()
  46.         # set architecture to architecture in root-dir
  47.         if options.rootdir and os.path.exists(options.rootdir+"/usr/bin/dpkg"):
  48.             arch = Popen([options.rootdir+"/usr/bin/dpkg","--print-architecture"], stdout=PIPE).communicate()[0]
  49.             if arch:
  50.                 apt_pkg.Config.Set("APT::Architecture",arch.strip())
  51.         if options.apt_opts:
  52.             for o in options.apt_opts:
  53.                 if o.find('=') < 0:
  54.                     sys.stderr.write(_("Configuration items must be specified with a =<value>\n"))
  55.                     sys.exit(1)
  56.                 (name, value) = o.split('=', 1)
  57.                 try:
  58.                     apt_pkg.Config.Set(name, value)
  59.                 except:
  60.                     sys.stderr.write(_("Couldn't set APT option %s to %s\n") % (name, value))
  61.                     sys.exit(1)
  62.         self._cache = Cache(tp, rootdir=options.rootdir)
  63.  
  64.     def open(self, file):
  65.         try:
  66.             if file.endswith(".deb"):
  67.                 self._deb = DebPackage(self._cache, file)
  68.             elif (file.endswith(".dsc") or
  69.                   os.path.basename(file) == "control"):
  70.                 self._deb = DscSrcPackage(self._cache, file)
  71.             else:
  72.                 sys.stderr.write(_("Unknown package type '%s', exiting\n") % file)
  73.                 sys.exit(1)
  74.         except (IOError,SystemError),e:
  75.             sys.stderr.write(_("Failed to open the software package\n"))
  76.             sys.stderr.write(_("The package might be corrupted or you are not "
  77.                            "allowed to open the file. Check the permissions "
  78.                            "of the file.\n"))
  79.             sys.exit(1)
  80.         # check the deps
  81.         if not self._deb.checkDeb():
  82.             sys.stderr.write(_("This package is uninstallable\n"))
  83.             sys.stderr.write(self._deb._failureString)
  84.             return False
  85.         return True
  86.             
  87.     def show_description(self):
  88.         try:
  89.             print self._deb["Description"]
  90.         except KeyError:
  91.             print _("No description is available")
  92.  
  93.     def show_dependencies(self):
  94.         # show what changes
  95.         (install, remove, unauthenticated) = self._deb.requiredChanges
  96.         if len(unauthenticated) > 0:
  97.             print _("The following packages are UNAUTHENTICATED: ")
  98.             for pkgname in unauthenticated:
  99.                 print pkgname + " ",
  100.         if len(remove) > 0:
  101.             print _("Requires the REMOVAL of the following packages: ")
  102.             for pkgname in remove:
  103.                 print pkgname + " ",
  104.         print
  105.         if len(install) > 0:
  106.             print _("Requires the installation of the following packages: ") 
  107.             for pkgname in install:
  108.                 print pkgname + " ",
  109.         print
  110.  
  111.     def install(self):
  112.         # install the dependecnies
  113.         (install,remove,unauthenticated) = self._deb.requiredChanges
  114.         if len(install) > 0 or len(remove) > 0:
  115.             fprogress = apt.progress.TextFetchProgress()
  116.             iprogress = apt.progress.InstallProgress()
  117.             res = self._cache.commit(fprogress,iprogress)
  118.  
  119.         # install the package itself
  120.         if self._deb.file.endswith(".dsc"): 
  121.             # FIXME: add option to only install build-dependencies
  122.             #        (or build+install the deb) and then enable
  123.             #        this code
  124.             #dir = self._deb.pkgName + "-" + apt_pkg.UpstreamVersion(self._deb["Version"])
  125.             #os.system("dpkg-source -x %s" % self._deb.file)
  126.             #os.system("cd %s && dpkg-buildpackage -b -uc" % dir)
  127.             #for i in self._deb.binaries:
  128.             #    os.system("gdebi %s_%s_*.deb" % (i,self._deb["Version"]))
  129.             pass
  130.         else:
  131.             os.system("dpkg -i %s"%self._deb.file)
  132.         
  133.  
  134. if __name__ == "__main__":
  135.     app = GDebiCli()
  136.     if not app.open(sys.argv[1]):
  137.         sys.exit(1)
  138.     print _("Do you want to install the software package? [y/N]:"),
  139.     sys.stdout.flush()
  140.     res = sys.stdin.readline()
  141.     if res.startswith("y") or res.startswith("Y"):
  142.         app.install()
  143.